package com.tomato.mybatis.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

/**
 * 反射工具类
 *
 * @author lizhifu
 */
public final class ReflectionUtils {

	/**
	 * 获取所有field字段，包含父类继承的
	 * @param clazz 字段所属类型
	 * @return 字段数组
	 */
	public static Field[] getFields(Class<?> clazz) {
		return getFields(clazz, null);
	}

	/**
	 * 获取指定类的所有的field,包括父类
	 * @param clazz 字段所属类型
	 * @param fieldFilter 字段过滤器
	 * @return 符合过滤器条件的字段数组
	 */
	public static Field[] getFields(Class<?> clazz, Predicate<Field> fieldFilter) {
		List<Field> fields = new ArrayList<>(32);
		while (Object.class != clazz && clazz != null) {
			// 获得该类所有声明的字段，即包括public、private和protected，但是不包括父类的申明字段，
			// getFields：获得某个类的所有的公共（public）的字段，包括父类中的字段
			for (Field field : clazz.getDeclaredFields()) {
				if (fieldFilter != null && !fieldFilter.test(field)) {
					continue;
				}
				fields.add(field);
			}
			clazz = clazz.getSuperclass();
		}
		return fields.toArray(new Field[0]);
	}

}
